package com.xw.strategy;

/**
 * @author: xw
 * @create: 2022/9/14 14:23
 * @description:
 */
public class Sort<T> {
    /**
     * 这种写法需要写很多的方法，因为参数是固定的
     * @param arr
     */
//    public void sort(Cat[] arr) {
//        for(int i=0; i<arr.length - 1; i++) {
//            int minPos = i;
//            for(int j=i+1; j<arr.length; j++) {
//                minPos = arr[j].compareTo(arr[minPos]) == -1 ? j : minPos;
//            }
//            swap(arr, i, minPos);
//        }
//    }

    /**
     * 这个任然不是策略模式，类里边已经写死了比较的方式
     * @param arr
     */
//    public void sort(Comparable[] arr) {
//        for(int i=0; i<arr.length - 1; i++) {
//            int minPos = i;
//            for(int j=i+1; j<arr.length; j++) {
//                minPos = arr[j].compareTo(arr[minPos]) == -1 ? j : minPos;
//            }
//            swap(arr, i, minPos);
//        }
//    }

    /**
     *  策略模式，需要传入自定义的比较器
     * @param arr
     * @param comparator
     */
    public void sort(T[] arr,Comparator<T> comparator) {
        for(int i=0; i<arr.length - 1; i++) {
            int minPos = i;
            for(int j=i+1; j<arr.length; j++) {
                minPos = comparator.compare(arr[j],arr[minPos]) ==-1 ? j : minPos;
            }
            swap(arr, i, minPos);
        }
    }

    //sort(int)

    void swap(T[] arr, int i, int j) {
        T temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
